åœéçãªããããæå¥œå®¶åãã«ãPythonã䜿çšããæ¯äŸã»ç©åã»åŸ®åïŒPIDïŒã³ã³ãããŒã©ãŒã®å®è£ ã«ã€ããŠè§£èª¬ããç·åã¬ã€ãã粟å¯ãªããããã·ã¹ãã å¶åŸ¡ã®ããã®çè«ãå®è·µçãªã³ãŒãã£ã³ã°ããã¥ãŒãã³ã°æè¡ãå®äžçã®å¿çšäŸãåŠã³ãŸãã
Pythonããããå¶åŸ¡ïŒPIDã³ã³ãããŒã©ãŒå®è£ ã®ç¿åŸ
ããããå·¥åŠã®ãã€ãããã¯ãªäžçã«ãããŠãã·ã¹ãã ã®æåãæ£ç¢ºãã€å®å®ããŠå¶åŸ¡ããããšã¯æãéèŠã§ããäžæŽå°ãèµ°è¡ããèªåŸåããŒããŒãç¹çްã«éšåãçµã¿ç«ãŠãããããã¢ãŒã ãå®å®ããé£è¡ãç¶æãããããŒã³ãªã©ãã©ã®ãããªãã®ãæ§ç¯ããã«ããŠããæ£ç¢ºãªå¶åŸ¡ãæ©èœæ§ãšä¿¡é Œæ§ãä¿èšŒããŸããããããå·¥åŠã§æ¡çšãããŠããæãæ®éçã§å¹æçãªå¶åŸ¡æŠç¥ã®äžã€ããæ¯äŸã»ç©åã»åŸ®åïŒPIDïŒã³ã³ãããŒã©ãŒã§ãããã®å æ¬çãªã¬ã€ãã§ã¯ãPythonã䜿çšããPIDã³ã³ãããŒã©ãŒã®å®è£ ã®è€éããæãäžããäžçäžã®ããããæå¥œå®¶ãåŠçãå°éå®¶ãèªèº«ã®å¶åŸ¡ã·ã¹ãã èšèšã匷åã§ããããã«ããŸãã
PIDå¶åŸ¡ã®æ¬è³ª
PIDã³ã³ãããŒã©ãŒã¯ããã®æ žå¿ã«ãããŠãç£æ¥çšå¶åŸ¡ã·ã¹ãã ãé£ç¶çãªèª¿æŽå¶åŸ¡ãå¿ èŠãšããä»ã®ã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšããããã£ãŒãããã¯å¶åŸ¡ã«ãŒãã¡ã«ããºã ã§ããããã¯ãæãŸããèšå®å€ãšæž¬å®ãããããã»ã¹å€æ°ãšã®éã®èª€å·®ãæå°åããããšãç®çãšããŠããŸããPIDã³ã³ãããŒã©ãŒã¯ã枬å®ãããããã»ã¹å€æ°ãšæãŸããèšå®å€ãšã®å·®ãšããŠèª€å·®å€ãèšç®ããŸããã³ã³ãããŒã©ãŒã¯ãããããã®ã¢ã¯ãã¥ãšãŒã¿ãŒã®äœçœ®ãã¢ãŒã¿ãŒã®é床ãªã©ã®ããã»ã¹ãžã®å¶åŸ¡åºåã調æŽããããšã«ãã£ãŠã誀差ãæå°åããããšããŸãã
PIDã³ã³ãããŒã©ãŒã¯ãå šäœã®å¶åŸ¡åäœã«ãããããå¯äžãã3ã€ã®åºæ¬é ã§æ§æãããŠããŸãïŒ
- æ¯äŸïŒPïŒé ïŒ ãã®é ã¯çŸåšã®èª€å·®ã«çŽæ¥æ¯äŸããŸãã誀差ã倧ããã»ã©ãå¶åŸ¡åºåã倧ãããªããŸããèšå®å€ããã®éžè±ã«å¯Ÿããäž»èŠãªå¿çãæäŸããŸããããããPã³ã³ãããŒã©ãŒã ãã«é Œããšãã·ã¹ãã ãç®æšå€ãããããã«ãããå€ã§å®å®ããŠããŸãå®åžžç¶æ 誀差ãçããããšããããããŸãã
- ç©åïŒIïŒé ïŒ ãã®é ã¯æéã®çµéã«äŒŽã誀差ã®ç©åã«æ¯äŸããŸããéå»ã®èª€å·®ãèç©ãã广çã«ãèšæ¶ãããŸããç©åé ã¯ã誀差ãé·æéæç¶ããå Žåã«å¶åŸ¡åºåãå¢å ãããããšã§ãå®åžžç¶æ 誀差ããªããã®ã«åœ¹ç«ã¡ãŸããããã¯ãæ éã«ç®¡çããªããšãªãŒããŒã·ã¥ãŒããåŒãèµ·ããå¯èœæ§ããããŸãã
- 埮åïŒDïŒé ïŒ ãã®é ã¯èª€å·®ã®å€åçïŒåŸ®åïŒã«æ¯äŸããŸãã誀差ãã©ãã ãéãå€åããŠããããèŠãããšã§ãå°æ¥ã®èª€å·®ãäºæž¬ããŸããDé ã¯ãã³ããŒãšããŠæ©èœããèª€å·®ãæ¥éã«æžå°ããŠãããšãã«å¶ååãå ããããšã§ããªãŒããŒã·ã¥ãŒããæ¯åãæžå°ãããŸãã
ããã3ã€ã®é ã®çµã¿åããã«ãããå¿çæ§ãå®åžžç¶æ ã®ç²ŸåºŠãããã³å®å®æ§ã®ãã©ã³ã¹ãåããªãããå ç¢ã§æ£ç¢ºãªå¶åŸ¡ãå¯èœã«ãªããŸãã
Pythonã§ã®PIDå®è£ ïŒå®è·µçã¢ãããŒã
Pythonã¯ããã®è±å¯ãªã©ã€ãã©ãªãšèªã¿ããããããç¹ã«ãããã¿ã€ãã³ã°ãããŒããªã¢ã«ã¿ã€ã ä¿èšŒãå¿ èŠãšããªãã·ã¹ãã ã«ãããŠãPIDã³ã³ãããŒã©ãŒãå®è£ ããããã®åªããéžæè¢ã§ããäžè¬çãªã¢ãããŒããšå¿ é ã®ã©ã€ãã©ãªã«ã€ããŠæ¢ããŸãã
åºæ¬çãªPIDå®è£ ïŒæŠå¿µïŒ
ã©ã€ãã©ãªã«é£ã³èŸŒãåã«ã颿£æéPIDã³ã³ãããŒã©ãŒã®æ žãšãªãããžãã¯ãçè§£ããŸããããããžã¿ã«ã·ã¹ãã ã§ã¯ã颿£çãªæéééïŒã¿ã€ã ã¹ãããïŒã§å¶åŸ¡åºåãèšç®ããŸãã
PIDã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãïŒ
å¶åŸ¡åºå = Kp * 誀差 + Ki * 誀差ã®ç©å + Kd * 誀差ã®åŸ®å
ããã§ïŒ
Kpã¯æ¯äŸã²ã€ã³ã§ããKiã¯ç©åã²ã€ã³ã§ããKdã¯åŸ®åã²ã€ã³ã§ãã誀差=èšå®å€-çŸåšå€èª€å·®ã®ç©åã¯æéã®çµéã«äŒŽã誀差ã®åèšã§ãã誀差ã®åŸ®åã¯èª€å·®ã®å€åçã§ãã
颿£å®è£ ã§ã¯ãç©åãšåŸ®åãæ¬¡ã®ããã«è¿äŒŒã§ããŸãïŒ
- ç©åè¿äŒŒïŒ æéã®çµéã«äŒŽã誀差ã®åèšãåã¹ãããã§ãçŸåšã®èª€å·®ãå®è¡äžã®åèšã«å ããŸãã
- 埮åè¿äŒŒïŒ çŸåšã®èª€å·®ãšåã®èª€å·®ã®å·®ããã¹ãããéã®æéå·®ã§å²ã£ããã®ã
Pythonã³ãŒãæ§é ïŒã·ã³ãã«ãªã¯ã©ã¹ïŒ
PIDã³ã³ãããŒã©ãŒã®ããžãã¯ãã«ãã»ã«åããã·ã³ãã«ãªPythonã¯ã©ã¹ãäœæããŠã¿ãŸãããããã®ã¯ã©ã¹ã¯ãã²ã€ã³ãç¶æ ïŒç©åå€ãšååã®èª€å·®ïŒããããŠå¶åŸ¡åºåã®èšç®ã管çããŸãã
class PIDController:
def __init__(self, kp, ki, kd, setpoint, sample_time=0.01):
self.kp = kp
self.ki = ki
self.kd = kd
self.setpoint = setpoint
self.sample_time = sample_time # Time interval between updates
self._integral = 0
self._previous_error = 0
self._last_time = None
def update(self, current_value):
current_time = time.time() # Using time module for simplicity
if self._last_time is None:
self._last_time = current_time
dt = current_time - self._last_time
if dt <= 0:
return 0 # Avoid division by zero or negative dt
error = self.setpoint - current_value
# Proportional term
p_term = self.kp * error
# Integral term (with anti-windup if needed, simplified here)
self._integral += error * dt
i_term = self.ki * self._integral
# Derivative term
derivative = (error - self._previous_error) / dt
d_term = self.kd * derivative
# Calculate total output
output = p_term + i_term + d_term
# Update state for next iteration
self._previous_error = error
self._last_time = current_time
return output
def set_setpoint(self, new_setpoint):
self.setpoint = new_setpoint
# Reset integral and previous error when setpoint changes significantly
self._integral = 0
self._previous_error = 0
def reset(self):
self._integral = 0
self._previous_error = 0
self._last_time = None
æ³šïŒ ããã¯åºæ¬çãªå®è£
ã§ããå®äžçã®ã¢ããªã±ãŒã·ã§ã³ãç¹ã«çµã¿èŸŒã¿ã·ã¹ãã ã§ã¯ãäžè²«ããæŽæ°ã¬ãŒãã確ä¿ããããã«éåžžã¿ã€ããŒããŒã¹ã®ã¢ãããŒããsample_timeã«äœ¿çšããç©åé
ã®ã¢ã³ãã¯ã€ã³ãã¢ããæŠç¥ãåºåã®é£œåãèæ
®ããå¿
èŠããããããããŸããã
æ¢åã®Pythonã©ã€ãã©ãªã®æŽ»çš
ç¬èªã®PIDã¯ã©ã¹ãæ§ç¯ããããšã¯æè²çã§ãããå ç¢ã§ååã«ãã¹ããããã©ã€ãã©ãªã¯ãããå€ãã®æ©èœãããè¯ãããã©ãŒãã³ã¹ãæäŸãããšããžã±ãŒã¹ããã广çã«åŠçããããšããããããŸãã以äžã«ããã€ãã®äººæ°ã®ããéžæè¢ã玹ä»ããŸãïŒ
1. simple-pid
ãã®ã©ã€ãã©ãªã¯ãPythonã§ã®PIDå¶åŸ¡ã®ç°¡åã§äœ¿ããããå®è£ ã§ãã
ã€ã³ã¹ããŒã«ïŒ
pip install simple-pid
䜿çšäŸïŒ
from simple_pid import PID
import time
# Assuming you have a function to get the current sensor value
def get_current_value():
# In a real robot, this would read from a sensor (e.g., encoder, IMU)
# For simulation, let's return a dummy value that changes over time
return 25.0 + time.time() * 0.5 # Example: drifting value
# Assuming you have a function to set the actuator output (e.g., motor PWM)
def set_actuator_output(output_value):
# In a real robot, this would control a motor, servo, etc.
print(f"Setting actuator output to: {output_value:.2f}")
# Configure the PID controller
# The first argument is the proportional gain (Kp)
# The second is the integral gain (Ki)
# The third is the derivative gain (Kd)
# The setpoint is the target value
pid = PID(1.0, 0.1, 0.05, setpoint=50.0)
# Optional: Set output limits to prevent actuator saturation
pid.output_limits = (-100, 100) # Example limits
# Optional: Set sample time (in seconds) - important for stability
# If not set, it defaults to 0.1 seconds
pid.sample_time = 0.02
print("Starting PID control loop...")
for _ in range(200): # Run for a certain number of iterations
current_val = get_current_value()
control_output = pid(current_val) # Calculate the control output
set_actuator_output(control_output) # Apply the output to the actuator
time.sleep(pid.sample_time) # Wait for the next control cycle
print("PID control loop finished.")
2. pidïŒMatthijs van WaverenäœïŒ
Pythonçšã®ããäžã€ã®è©äŸ¡ã®é«ãPIDã©ã€ãã©ãªã§ãåæ§ã®æ©èœæ§ãšå ç¢æ§ãæäŸããŸãã
ã€ã³ã¹ããŒã«ïŒ
pip install pid
䜿çšäŸïŒ
from pid import PID
import time
# Placeholder functions for sensor reading and actuator control
def get_sensor_reading():
# Simulate a sensor reading that drifts over time
return 10.0 + time.monotonic() * 0.3
def set_motor_speed(speed):
# Simulate setting motor speed
print(f"Motor speed set to: {speed:.2f}")
# Initialize PID controller
# Kp, Ki, Kd gains, setpoint, output minimum, output maximum
pid_controller = PID(1.5, 0.2, 0.1, setpoint=30.0)
pid_controller.set_output_limits(-50, 50)
print("Starting PID control...")
target_value = 30.0
for i in range(100):
current_value = get_sensor_reading()
control_signal = pid_controller(current_value)
set_motor_speed(control_signal)
# Simulate time passing between control updates
time.sleep(0.05)
print("PID control finished.")
PIDã³ã³ãããŒã©ãŒã®ãã¥ãŒãã³ã°ïŒèžè¡ãšç§åŠ
ãããããPIDå¶åŸ¡ã®æãéèŠã§ææŠçãªåŽé¢ã¯ããã®ãã©ã¡ãŒã¿ã§ããKpãKiãKdã®ãã¥ãŒãã³ã°ã§ããäžé©åãªãã¥ãŒãã³ã°ã¯ãäžå®å®ãªæåãé
ãå¿çããŸãã¯éåºŠã®æ¯åã«ã€ãªããå¯èœæ§ããããŸãããã¥ãŒãã³ã°ã¯ãã·ã¹ãã ãæãŸããæ§èœãéæãããŸã§ãããã®ã²ã€ã³ã調æŽããå埩çãªããã»ã¹ã§ããããšãå€ãã§ãã
äžè¬çãªãã¥ãŒãã³ã°æ¹æ³
- æåãã¥ãŒãã³ã°ïŒ ããã¯ãã·ã¹ãã ã®å¿çã芳å¯ããªããã²ã€ã³ãæåã§èª¿æŽããçŽæçãªã¢ãããŒãã§ããäžè¬çãªæŠç¥ã¯æ¬¡ã®ãšããã§ãïŒ
KiãšKdããŒãããå§ããŸãã- ã·ã¹ãã ãäžå®ã®æ¯å¹
ã§æ¯åãããŸã§
KpãåŸã ã«å¢ãããŸãããããéçæ¯äŸã²ã€ã³ïŒKuïŒãšæ¯ååšæïŒPuïŒã§ãã - ãžãŒã°ã©ãŒã»ãã³ã«ã¹æ³ãCHRïŒChien-Hrones-ReswickïŒãã¥ãŒãã³ã°åãçšããŠã
KuãšPuã«åºã¥ããŠåæã®KpãKiãKdã®å€ãèšç®ããŸãã - æãŸãããªãŒããŒã·ã¥ãŒããæŽå®æéãå®åžžç¶æ 誀差ãéæããããã«ã²ã€ã³ã埮調æŽããŸãã
- ãžãŒã°ã©ãŒã»ãã³ã«ã¹æ³ïŒ ããã¯åºãç¥ãããŠãããã¥ãŒãªã¹ãã£ãã¯ãªãã¥ãŒãã³ã°æ¹æ³ã§ãæåãã¥ãŒãã³ã°ã§åŸãããéçã²ã€ã³ïŒ
KuïŒãšéçåšæïŒPuïŒã䜿çšããŠåæã®PIDãã©ã¡ãŒã¿ãèšç®ããŸãã广çã§ãããæã«ã¯å€§ããªãªãŒããŒã·ã¥ãŒãã䌎ãç©æ¥µçãªãã¥ãŒãã³ã°ã«ãªãããšããããŸãã - CHRïŒChien-Hrones-ReswickïŒæ³ïŒ ãã®æ¹æ³ã¯ãžãŒã°ã©ãŒã»ãã³ã«ã¹æ³ãããäœç³»çãªã¢ãããŒããæäŸããæãŸããéæž¡å¿çç¹æ§ïŒäŸïŒååã®äžæžè¡°æ¯ããŒãæžè¡°æ¯ïŒã«åºã¥ããŠç°ãªããã¥ãŒãã³ã°ãã©ã¡ãŒã¿ã®ã»ãããæäŸããŸãã
- ãªãŒããã¥ãŒãã³ã°ïŒ ããã€ãã®é«åºŠãªPIDã³ã³ãããŒã©ãŒãã©ã€ãã©ãªã¯ãç¹å®ã®ãã¹ãä¿¡å·ã«å¯Ÿããã·ã¹ãã ã®å¿çã芳å¯ããããšã§æé©ãªPIDãã©ã¡ãŒã¿ãèªåçã«æ±ºå®ãããªãŒããã¥ãŒãã³ã°æ©èœãæäŸããŸããããã¯éåžžã«äŸ¿å©ã§ããããã¹ãŠã®ã·ã¹ãã ã§æè¯ã®çµæãåŸããããšã¯éããŸããã
ããããå·¥åŠã«ããããã¥ãŒãã³ã°ã®èæ ®äºé
ããããã¢ããªã±ãŒã·ã§ã³çšã«PIDã³ã³ãããŒã©ãŒããã¥ãŒãã³ã°ããéã«ã¯ã次ã®ç¹ãèæ ®ããŠãã ããïŒ
- ã·ã¹ãã ã®ãã€ããã¯ã¹ïŒ ããªãã®ããããã®ç©ççç¹æ§ãçè§£ããŠãã ãããéããŠåããé ãã§ããããããšã軜ããŠæ©æã§ããïŒããã¯å¿ èŠãªã²ã€ã³ã«å€§ãã圱é¿ããŸãã
- ã¢ã¯ãã¥ãšãŒã¿ãŒã®å¶éïŒ ããããã«ã¯ã¢ãŒã¿ãŒã®é床ããã«ã¯ããŸãã¯ãµãŒãã®è§åºŠã«ç©ççãªå¶éãããããšããããããŸããPIDåºåããããã®å¶éãè¶
ããªãããã«ããŠãã ãããã©ã€ãã©ãªã§
output_limitsã䜿çšããããšãéèŠã§ãã - ã»ã³ãµãŒãã€ãºïŒ ã»ã³ãµãŒã®èªã¿åãå€ã«ã¯ãã€ãºãå«ãŸããŠããå¯èœæ§ããããããã¯åŸ®åé ã«ãã£ãŠå¢å¹ ãããããšããããŸããã»ã³ãµãŒå ¥åããã£ã«ã¿ãªã³ã°ããããããå ç¢ãªåŸ®åèšç®ã䜿çšãããªã©ã®æè¡ãå¿ èŠã«ãªãå ŽåããããŸãã
- ãµã³ãã«æéïŒ PIDã³ã³ãããŒã©ãŒãæŽæ°ãããé »åºŠã¯éåžžã«éèŠã§ããæŽæ°ã¬ãŒããé ããããšäžå®å®ã«ãªãå¯èœæ§ããããéããããšããŒããŠã§ã¢ã§éæã§ããªãããäžèŠãªèšç®ãå°å ¥ããå¯èœæ§ããããŸãã
- ç©åã¯ã€ã³ãã¢ããïŒ ã¢ã¯ãã¥ãšãŒã¿ãŒã飜åïŒéçã«éãïŒãã誀差ããŸã 倧ããå Žåãç©åé ãé床ã«å€§ãããªãããšããããŸãããã®ãç©åã¯ã€ã³ãã¢ãããã¯ãã·ã¹ãã ãæçµçã«é£œåç¶æ ããè±ãããšãã«ã倧ããªãªãŒããŒã·ã¥ãŒããšé ãå埩ãåŒãèµ·ããå¯èœæ§ããããŸããç©åé ãå¶éãããã飜åãçºçãããšãã«ãªã»ããããããããªã©ãã¢ã³ãã¯ã€ã³ãã¢ãã察çãå®è£ ããŠãã ããã
Pythonããããå·¥åŠã«ãããå®çšçãªå¿çš
PIDã³ã³ãããŒã©ãŒã¯éåžžã«çšéãåºããããããå·¥åŠã®ã»ãŒãã¹ãŠã®åŽé¢ã§å¿çšãããŠããŸãã
1. ã¢ãŒã¿ãŒé床å¶åŸ¡
DCã¢ãŒã¿ãŒã®é床ãè»èŒªä»ãããããã®é床ãå¶åŸ¡ããããšã¯ãå žåçãªPIDã¢ããªã±ãŒã·ã§ã³ã§ããèšå®å€ã¯æãŸããé床ïŒäŸïŒRPMãŸãã¯ã¡ãŒãã«/ç§ïŒã§ãããããã»ã¹å€æ°ã¯ãšã³ã³ãŒããŒããåŸãããããšãå€ãå®éã®æž¬å®é床ã§ãã
ã·ããªãªäŸïŒ 2茪差åé§åãããããäžå®ã®é床ã§åé²ããå¿ èŠããããŸããåè»èŒªã«ã¯ãšã³ã³ãŒããŒä»ãã®ã¢ãŒã¿ãŒããããŸããåã¢ãŒã¿ãŒã®PIDã³ã³ãããŒã©ãŒã¯ç¬ç«ããŠãã®é床ã調æŽã§ããŸããäž¡æ¹ã®PIDã³ã³ãããŒã©ãŒãžã®ã³ãã³ãã®åèšãããããå šäœã®éåºŠãæ±ºå®ãããã®å·®ãæåãå¶åŸ¡ããŸãã
2. äœçœ®å¶åŸ¡ïŒããããã¢ãŒã ãã°ãªãããŒïŒ
ããããã¢ãŒã ã¯ããã®é¢ç¯ã®æ£ç¢ºãªäœçœ®æ±ºããå¿ èŠãšããŸããPIDã³ã³ãããŒã©ãŒã䜿çšããŠããµãŒãã¢ãŒã¿ãŒãã¹ãããã³ã°ã¢ãŒã¿ãŒãç¹å®ã®è§åºŠäœçœ®ã«é§åããããšãã§ããŸããèšå®å€ã¯ç®æšè§åºŠã§ãããããã»ã¹å€æ°ã¯ãšã³ã³ãŒããŒãããã³ã·ã§ã¡ãŒã¿ãŒã«ãã£ãŠæž¬å®ãããçŸåšã®è§åºŠã§ãã
ã·ããªãªäŸïŒ ããããã¢ãŒã ãç©äœãæŽãå¿ èŠããããŸãããšã³ããšãã§ã¯ã¿ãŒãæ£ç¢ºãªXYZ座æšã«ç§»åãããå¿ èŠããããŸããã¢ãŒã ã®åé¢ç¯ã«ã¯ããšã³ããšãã§ã¯ã¿ãŒå šäœãæãŸããäœçœ®ã«ãªãããã«ãããããã®ç®æšè§åºŠã«å°éããããã®ç¬èªã®PIDã³ã³ãããŒã©ãŒããããŸããããã«ã¯ãæãŸãããšã³ããšãã§ã¯ã¿ãŒã®å§¿å¢ãé¢ç¯è§åºŠã«å€æããããã®ééååŠããã°ãã°é¢ãããŸãã
3. ãããŒã³ã®é«åºŠããã³å§¿å¢å®å®å
ãããŒã³ã¯ãå®å®ããé£è¡ãç¶æããããã«PIDã³ã³ãããŒã©ãŒã«å€§ããäŸåããŠããŸããé«åºŠå¶åŸ¡ã¯éåžžãPIDã³ã³ãããŒã©ãŒã䜿çšããŠãæãŸããé«åºŠã«åºã¥ããŠåçŽæšåã調æŽããŸããå§¿å¢å¶åŸ¡ïŒããããããŒã«ããšãŒïŒã¯ãPIDã³ã³ãããŒã©ãŒã䜿çšããŠã¢ãŒã¿ãŒé床ã調æŽããå€ä¹±ã«å¯ŸæããŠæãŸããåããç¶æããŸãã
ã·ããªãªäŸïŒ ã¯ã¢ããã³ãã¿ãŒãç¹å®ã®é«åºŠã§ãããªã³ã°ããå¿ èŠããããŸããé«åºŠèšïŒäŸïŒæ°å§ã»ã³ãµãŒïŒãçŸåšã®é«åºŠãæäŸããŸããPIDã³ã³ãããŒã©ãŒã¯ãããæãŸããé«åºŠãšæ¯èŒãããããŒã³ãå®å®ãããããã«ã¢ãŒã¿ãŒã®éåçãªæšåã調æŽããŸããåæ§ã®PIDã«ãŒããããžã£ã€ãã¹ã³ãŒããšå é床èšã®ããŒã¿ã«åºã¥ããŠããããšããŒã«ã管çããŸãã
4. ã©ã€ã³è¿œåŸãããã
ã©ã€ã³è¿œåŸããããã¯ããããããã©ã€ã³ã®äžå€®ã«ä¿ã€ããã«PIDå¶åŸ¡ããã䜿çšããŸããèšå®å€ã¯ã©ã€ã³ã®äžå¿ïŒäŸïŒç¹å®ã®ã»ã³ãµãŒèªã¿åãå€ã®å·®ïŒã§ãããããã»ã¹å€æ°ã¯ãèµ€å€ç·ãŸãã¯ã«ã©ãŒã»ã³ãµãŒã®ã¢ã¬ã€ã«ãã£ãŠæž¬å®ãããããããããäžå¿ããã©ãã ããããŠãããã§ãã
ã·ããªãªäŸïŒ äžéšã«ã»ã³ãµãŒã¢ã¬ã€ãåããããããããçœã衚é¢äžã®é»ãã©ã€ã³ã远åŸããã¿ã¹ã¯ãäžããããŸããã»ã³ãµãŒããããããã©ã€ã³ã®å·Šã«ãããããŠããããšãæ€åºãããšãPIDã³ã³ãããŒã©ãŒã¯ã¢ãŒã¿ãŒé床ã調æŽããŠäžå¿ã«æ»ãããã«æçžŠããŸããPé ã¯çŸåšã®éžè±ã«åå¿ããIé ã¯æç¶çãªäžå¿ããã®ãããä¿®æ£ããDé ã¯æ¥ãªæåãæ»ããã«ããŸãã
5. 枩床å¶åŸ¡ïŒäŸïŒ3Dããªã³ã¿ãŒçšïŒ
å®å®ããæž©åºŠãç¶æããããšã¯ã3Dããªã³ã¿ãŒã®ããºã«ãããŒãããããããªã©ãå€ãã®ããããã·ã¹ãã ã«ãšã£ãŠéèŠã§ããPIDã³ã³ãããŒã©ãŒã¯ã枩床ã»ã³ãµãŒããã®èªã¿åãå€ã«åºã¥ããŠãçºç±äœã«äŸçµŠãããé»åã調æŽããŸãã
ã·ããªãªäŸïŒ 3Dããªã³ã¿ãŒã®ããããšã³ãã¯ããã£ã©ã¡ã³ããæº¶ããããã«æ£ç¢ºãªæž©åºŠïŒäŸïŒ220°CïŒã«ä¿ã€å¿ èŠããããŸããæž©åºŠã»ã³ãµãŒïŒãµãŒãã¹ã¿ãŒãŸãã¯ç±é»å¯ŸïŒãçŸåšã®æž©åºŠãPIDã³ã³ãããŒã©ãŒã«éããŸããã³ã³ãããŒã©ãŒã¯ãèšå®å€ãç¶æããããã«å ç±ã«ãŒããªããžãžã®é»åïŒå€ãã®å ŽåPWMãä»ããŠïŒãå€èª¿ããç±æå€±ãå€åãè£åããŸãã
é«åºŠãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
åºæ¬çãªå®è£ ãè¶ ããŠé²ãã«ã€ããŠãããã€ãã®é«åºŠãªãããã¯ãšãã¹ããã©ã¯ãã£ã¹ãPIDå¶åŸ¡ã·ã¹ãã ã匷åããŸãïŒ
- 埮åããã¯ïŒ èšå®å€ãçªç¶å€æŽããããšã埮åé ãå¶åŸ¡åºåã«å€§ããªã¹ãã€ã¯ïŒããã¯ïŒãåŒãèµ·ããå¯èœæ§ããããŸããããã軜æžããããã«ã埮åã¯èª€å·®ã§ã¯ãªã枬å®å€æ°ã«åºã¥ããŠèšç®ãããããšããããããŸãã
d_term = self.kd * (current_value - self._previous_value) / dt
- ç©åã¢ã³ãã¯ã€ã³ãã¢ããïŒ åè¿°ã®ããã«ãå¶åŸ¡åºåã飜åãããšãç©åé ãé床ã«èç©ãããå¯èœæ§ããããŸããäžè¬çãªæŠç¥ã¯æ¬¡ã®ãšããã§ãïŒ
- ã¯ã©ã³ãã³ã°ïŒ åºåã飜åãã誀差ããããããã«å¢å ãããåå ãšãªãå Žåã«ãç©åé ã®èç©ã忢ããŸãã
- ããã¯ã«ã«ãã¥ã¬ãŒã·ã§ã³ïŒ åºåãã©ãã ã飜åããŠãããã«åºã¥ããŠç©åé ãæžå°ãããŸãã
- æ¡ä»¶ä»ãç©åïŒ åºåã飜åããŠããªãå Žåã«ã®ã¿èª€å·®ãç©åããŸãã
- ãã£ã«ã¿ãªã³ã°ïŒ ã»ã³ãµãŒèªã¿åãå€ã®é«åšæ³¢ãã€ãºã¯ã埮åé ã«ãšã£ãŠåé¡ãšãªãå¯èœæ§ããããŸããã»ã³ãµãŒå ¥åãŸãã¯åŸ®åé èªäœã«ããŒãã¹ãã£ã«ã¿ãŒãé©çšããããšã§ãå®å®æ§ãåäžãããããšãã§ããŸãã
- ã²ã€ã³ã¹ã±ãžã¥ãŒãªã³ã°ïŒ éåžžã«éç·åœ¢ãªãã€ããã¯ã¹ãå€åããåäœæ¡ä»¶ãæã€ã·ã¹ãã ã§ã¯ãåºå®ãããPIDã²ã€ã³ã®ã»ãããæé©ã§ãªãå ŽåããããŸããã²ã€ã³ã¹ã±ãžã¥ãŒãªã³ã°ã¯ãã·ã¹ãã ã®çŸåšã®åäœç¹ïŒäŸïŒé床ãäœçœ®ãè² è·ïŒã«åºã¥ããŠPIDã²ã€ã³ã調æŽããããšãå«ã¿ãŸãã
- ã«ã¹ã±ãŒãå¶åŸ¡ïŒ è€éãªã·ã¹ãã ã§ã¯ããã¹ã¿ãŒPIDã³ã³ãããŒã©ãŒã1ã€ä»¥äžã®ã¹ã¬ãŒãPIDã³ã³ãããŒã©ãŒã®èšå®å€ãèšå®ããããšããããŸããäŸãã°ãããããã®ã¢ãŒã·ã§ã³ãã©ã³ããŒããäœã¬ãã«ã®ã¢ãŒã¿ãŒã³ã³ãããŒã©ãŒã®PIDã«å¯ŸããŠç®æšé床ãèšå®ããããšããããŸãã
- ãªã¢ã«ã¿ã€ã ã®èæ ®äºé ïŒ å³å¯ãªã¿ã€ãã³ã°ä¿èšŒãå¿ èŠãªã¢ããªã±ãŒã·ã§ã³ïŒäŸïŒé«éç£æ¥çšãããããè€éãªèªåŸèªæ³ïŒã§ã¯ãPythonã®ã°ããŒãã«ã€ã³ã¿ãŒããªã¿ããã¯ïŒGILïŒãšãã®é決å®çãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå¶çŽãšãªãå¯èœæ§ããããŸãããã®ãããªå Žåã¯ãæéçã«éèŠãªèšç®ãã³ã³ãã€ã«æžã¿æ¡åŒµæ©èœïŒC/C++ã¢ãžã¥ãŒã«ãªã©ïŒã«ãªãããŒãã§ããã©ã€ãã©ãªã䜿çšããããæãããã©ãŒãã³ã¹ãéèŠãªã«ãŒãã«ã¯ããäœã¬ãã«ã®èšèªãæã€ãªã¢ã«ã¿ã€ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒRTOSïŒãæ¡çšããããšãæ€èšããŠãã ããã
PIDã³ã³ãããŒã©ãŒã®ãããã°
PIDã³ã³ãããŒã©ãŒã®ãããã°ã¯å°é£ãªå ŽåããããŸãã以äžã«ããã€ãã®ãã³ãã瀺ããŸãïŒ
- ãã®ã³ã°ïŒ åã¿ã€ã ã¹ãããã§èšå®å€ãçŸåšå€ã誀差ãå¶åŸ¡åºåããã°ã«èšé²ããŸãããã®ããŒã¿ãæéçµéã§èŠèŠåããããšã§ãæ¯åãé ãå¿çããªãŒããŒã·ã¥ãŒããªã©ã®åé¡ãæããã«ã§ããŸãã
- ã¹ãããå¿çåæïŒ èšå®å€ãæ¥æ¿ã«å€åãããšãã®ã·ã¹ãã ã®åå¿ã芳å¯ããŸããããã«ãããPIDã³ã³ãããŒã©ãŒãéæž¡å¿çãã©ãã ãããŸãåŠçããŠããããããããŸãã
- é ã®åé¢ïŒ Pé ã®ã¿ã次ã«P+Iãæ¬¡ã«P+I+Dã§ã·ã¹ãã ããã¹ãããåé ã®å¯äžãçè§£ããŸãã
- åäœã®ç¢ºèªïŒ ã²ã€ã³ãèšå®å€ãã»ã³ãµãŒã®èªã¿åãå€ã®åäœãäžè²«ããŠããããšã確èªããŠãã ããã
- ã·ãã¥ã¬ãŒã·ã§ã³ïŒ å¯èœã§ããã°ãããŒããŠã§ã¢ã«å±éããåã«ãç©çãšã³ãžã³ïŒPyBulletãGazeboãªã©ïŒã§ããããã®ãã€ããã¯ã¹ãã·ãã¥ã¬ãŒãããŸããããã«ãããå¶åŸ¡æŠç¥ã®å®å šãã€è¿ éãªãã¹ããå¯èœã«ãªããŸãã
ããããå·¥åŠã«ãããPythonã®ã°ããŒãã«ãªç¶æ³
Pythonã®ã¢ã¯ã»ã·ããªãã£ãšåºå€§ãªãšã³ã·ã¹ãã ã¯ãäžçäžã®ããããå·¥åŠæè²ãšè¿ éãªãããã¿ã€ãã³ã°ã«ãããŠæ¯é çãªåãšãªã£ãŠããŸããåç±³ããã¢ãžã¢ãŸã§ã®å€§åŠãããããå·¥åŠã®ã³ãŒã¹ã§Pythonã䜿çšããŠãããããžã§ã³çšã®OpenCVããã¬ãŒã ã¯ãŒã¯çšã®ROSïŒRobot Operating SystemïŒãæ°å€èšç®çšã®NumPy/SciPyãªã©ã®ã©ã€ãã©ãªã掻çšããŠããããããã¯ãã¹ãŠPIDå¶åŸ¡ã®å®è£ ãšã·ãŒã ã¬ã¹ã«çµ±åãããŸãã
ãšãŒãããã®ããã€ã¹ããããžã§ã¯ãããåç±³ã®ç 究掻åã«è³ããŸã§ããªãŒãã³ãœãŒã¹ã®ããããå·¥åŠãããžã§ã¯ãã§ã¯ãå¶åŸ¡ããžãã¯ã«Pythonãé »ç¹ã«å©çšãããŠããŸããããã«ãããéçºè ãPIDãã¥ãŒãã³ã°æŠç¥ãå®è£ æè¡ãå ±æããé©å¿ãããããšãã§ããå調çãªç°å¢ãè²ãŸããŸããäŸãã°ã蟲æ¥ã¢ãã¿ãªã³ã°çšã«èª¿æŽããããããŒã³ã®çŸ€ããéçºããå Žåãç°ãªããããŒã³ãã©ãããã©ãŒã éã§æšæºåãããPython PIDå®è£ ã䜿çšããããšã§ãäžå€®ã®PythonããŒã¹ã®å°äžå±ããã®çµ±åãšå¶åŸ¡ã容æã«ãªããŸãã
ããã«ãåªããPythonãµããŒããæã€Raspberry PiãNVIDIA JetsonããŒãã®ãããªã·ã³ã°ã«ããŒãã³ã³ãã¥ãŒã¿ã®æ¡çšãå¢å ããŠããããšã§ãæŽç·ŽãããPIDå¶åŸ¡ã¢ã«ãŽãªãºã ãçµã¿èŸŒã¿ãããããã©ãããã©ãŒã äžã§çŽæ¥å®è¡ããããšãå¯èœã«ãªããå€éšã®èšç®ã«åžžã«äŸåããããšãªããããèªåŸçã§å¿çæ§ã®é«ãæåãä¿é²ããŠããŸãã
çµè«
æ¯äŸã»ç©åã»åŸ®åïŒPIDïŒã³ã³ãããŒã©ãŒã¯ãå¶åŸ¡ã·ã¹ãã å·¥åŠã®åºç€ã§ããç¶ãããã®Pythonã§ã®å®è£ ã¯ãäžçäžã®ããããéçºè ã«ãšã£ãŠåŒ·åã§ã¢ã¯ã»ã¹ããããããŒã«ãæäŸããŸããPãIãDé ã®ååãçè§£ããæ¢åã®Pythonã©ã€ãã©ãªã掻çšããå¥å šãªãã¥ãŒãã³ã°ãã©ã¯ãã£ã¹ãé©çšããããšã§ãããããã·ã¹ãã ã®ããã©ãŒãã³ã¹ãå®å®æ§ã粟床ãå€§å¹ ã«åäžãããããšãã§ããŸãã
åºæ¬çãªã¢ãŒã¿ãŒå¶åŸ¡ãæ¢æ±ããåŠçãè€éãªèªåŸãšãŒãžã§ã³ããéçºããç ç©¶è ããããã¯æ¬¡ã®ããããäœåãæ§ç¯ããããã€ã¹ãã§ãããPythonã§ã®PIDå¶åŸ¡ãç¿åŸããããšã¯éåžžã«è²Žéãªã¹ãã«ãšãªãã§ããããPIDã³ã³ãããŒã©ãŒã®ãã¥ãŒãã³ã°ãšæé©åã®æ ã¯ãç¶ç¶çãªåŠç¿ãšå®éšã®äžã€ã§ããããŸããŸãæŽç·Žãããèœåã®é«ãããããã«ã€ãªãããŸããææŠãåãå ¥ããæäŸãããäŸã§å®éšãã仿¥ããããã€ã³ããªãžã§ã³ãã§å¿çæ§ã®é«ãããããã·ã¹ãã ã®æ§ç¯ãå§ããŸãããïŒ